package com.ztgf.pay.scheduled;

import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.ztgf.common.constant.Result;
import com.ztgf.common.utils.DateUtils;
import com.ztgf.pay.common.config.YmlConfig;
import com.ztgf.pay.models.bo.PayZjBalanceLogBO;
import com.ztgf.pay.models.dto.*;
import com.ztgf.pay.models.service.*;
import com.ztgf.pay.models.vo.PayZjBalanceLogVO;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.lang.reflect.InvocationTargetException;
import java.text.ParseException;
import java.time.Instant;
import java.time.LocalDate;
import java.time.ZoneId;
import java.util.Date;
import java.util.List;


/**
 * @Description ： 暂时不加主动获取信息， 因为中金支付 如果先查询，用户没有支付 则这条支付订单失败，不能支付故不能先拉区
 * @Author ： 解风
 * @Date ： 2018/01/26 14:10
 */
@Component
@Slf4j
public class ScheduledTimes {
    @Resource
    private YmlConfig ymlConfig;
    @DubboReference
    private IPayUserRechargeService payUserRechargeService;

    @DubboReference
    private IPayOrderRepayService payOrderRepayService;

    @DubboReference
    private IPayOrderMotherService payOrderMotherService;

    @DubboReference
    private IPayOrderService payOrderService;
    @DubboReference
    private IPayUserService payUserService;

    @DubboReference
    private IPayFundDetailsService payFundDetailsService;
    @Value("${ztgf-income-user-id}")
    private Long ztgfIncomeUserId;//中铁工服收益账号
    @DubboReference
    private IPayFundSyncService payFundSyncService;

    /**
     * 暂时 每1分钟执行一次 更新订单过期时间
     */
    @Scheduled(cron = "0 0/1 * * * ?")
    public void executeRecharge(){
        log.info("--------------定时任务：主动查询更新出入金状态 ------------------");
        Wrapper wrapper = new EntityWrapper();
        Object[] status = {0, 1};
        wrapper.in("status", status);
        Object[] type = {0, 1, 2};
        wrapper.in("type", type);
        List<PayUserRechargeDTO> list = payUserRechargeService.selectList(wrapper);
        if(list != null && list.size() > 0){
            for (PayUserRechargeDTO dto : list) {
                try{
                    payUserRechargeService.saveMoneyLog(dto);
                } catch (Exception e){
                    log.error("定时任务：主动查询更新出入金状态"+ JSON.toJSONString(dto), e);
                }
            }
        }
    }

    /**
     * 暂时 每1分钟执行一次 更新订单过期时间
     */
    @Scheduled(cron = "0 10/1 * * * ?")
    public void executeOnlineBank(){
        log.info("--------------定时任务：保存查询网银支付状态 ------------------");
        Wrapper wrapper = new EntityWrapper();
        wrapper.eq("type", 1);
        Object[] status = {0, 1};
        wrapper.in("status", status);
//        wrapper.ge("create_time", DateUtils.addDay(DateUtils.getCurrentDateTime(), -7));
        List<PayOrderMotherDTO> list = payOrderMotherService.selectList(wrapper);
        if(list != null && list.size() > 0){
            for (PayOrderMotherDTO dto : list) {
                try{
                    payOrderService.saveOnlineBankPayLog(dto);
                } catch (Exception e){
                    log.error("定时任务：保存查询网银支付状态"+ JSON.toJSONString(dto), e);
                }

            }
        }
    }


    /**
     * 暂时 每1分钟执行一次 更新订单过期时间
     */
    @Scheduled(cron = "0 0/1 * * * ?")
    public void executeBalancePay(){
        log.info("--------------定时任务：保存查询余额支付状态 ------------------");
        Wrapper wrapper = new EntityWrapper();
        wrapper.eq("type", 0);
        Object[] status = {0, 1};
        wrapper.in("status", status);
//        wrapper.ge("create_time", DateUtils.addDay(DateUtils.getCurrentDateTime(), -7));
        List<PayOrderDTO> list = payOrderService.selectList(wrapper);
        if(list != null && list.size() > 0){
            for (PayOrderDTO dto : list) {
                try{
                    payOrderService.saveBalancePayLog(dto);
                } catch (Exception e){
                    log.error("定时任务：保存查询余额支付状态"+ JSON.toJSONString(dto), e);
                }

            }
        }
    }

  /*  *//**
     * 当天的资金明细入库
     *//*
    @Scheduled(cron = "0 50 23 * * ?")
    public void fundDetail(){
        log.info("--------------定时任务：资金明细入库 ------------------");
        EntityWrapper<PayUserDTO> wrapper = new EntityWrapper<>();
        wrapper.eq("account_type",1);
        List<PayUserDTO> list = payUserService.selectList(wrapper);
        log.info("====================list="+list.size());
        if (list!=null && list.size()>0){
            for (PayUserDTO payUserDTO : list) {
                PayZjBalanceLogBO payZjBalanceLogBO = new PayZjBalanceLogBO();
                payZjBalanceLogBO.setUserId(payUserDTO.getUserId());

                List<PayZjBalanceLogVO> logVOList = payUserService.queryPageZjBalance(payZjBalanceLogBO);
                if (logVOList!=null && logVOList.size()>0){
                    log.info("====================logVOList="+logVOList.size());
                    for (PayZjBalanceLogVO payZjBalanceLogVO : logVOList) {

                        PayFundDetailsDTO payFundDetailsDTO = new PayFundDetailsDTO();
                        payFundDetailsDTO.setId(ymlConfig.getPkId());
                        try {
                            BeanUtils.copyProperties(payFundDetailsDTO,payZjBalanceLogVO);
                        } catch (IllegalAccessException e) {
                            e.printStackTrace();
                        } catch (InvocationTargetException e) {
                            e.printStackTrace();
                        }
                        payFundDetailsService.insert(payFundDetailsDTO);
                    }
                }
            }

        }
    }*/


//    //前一天的资金明细数据入库
//    @Scheduled(cron = "0 15 7 * * ?")
//    public void fundDetailByHistory(){
//        log.info("--------------定时任务：资金明细入库 ------------------");
//        EntityWrapper<PayUserDTO> wrapper = new EntityWrapper<>();
//        wrapper.eq("account_type",1);
//        List<PayUserDTO> list = payUserService.selectList(wrapper);
//        log.info("====================list="+list.size());
//        if (list!=null && list.size()>0) {
//            for (PayUserDTO payUserDTO : list) {
//                    PayZjBalanceLogBO payZjBalanceLogBO = new PayZjBalanceLogBO();
//                    payZjBalanceLogBO.setUserId(payUserDTO.getUserId());
//                    payZjBalanceLogBO.setPageNo(1);
//                    payZjBalanceLogBO.setPageSize(20);
//
//                    LocalDate endDate = LocalDate.now();
//                    LocalDate biginDate = endDate.plusDays(-1);
//                    endDate=biginDate;
//                    ZoneId zone = ZoneId.systemDefault();
//                    Instant instant = biginDate.atStartOfDay().atZone(zone).toInstant();
//                    Instant instant1 = endDate.atStartOfDay().atZone(zone).toInstant();
//                    java.util.Date bdate = Date.from(instant);
//                    java.util.Date edate = Date.from(instant1);
//
//                    payZjBalanceLogBO.setStartDate(bdate);
//                    payZjBalanceLogBO.setEndDate(edate);
//
//                    Result<Page<PayZjBalanceLogVO>> pageResult = payUserService.queryPageZjHistoryBalanceLog(payZjBalanceLogBO);
//                    if (pageResult != null) {
//                        Page<PayZjBalanceLogVO> data = pageResult.getData();
//                        if (data != null) {
//                            if (data.getTotal() > 0) {
//
//                               int ceil= data.getTotal()%data.getSize()>0? (data.getTotal()/data.getSize()+1):data.getTotal()/data.getSize();
//                                for (int j = 1; j <= ceil; j++) {
//                                    payZjBalanceLogBO.setPageNo(j);
//                                    Result<Page<PayZjBalanceLogVO>> pageResult1 = payUserService.queryPageZjHistoryBalanceLog(payZjBalanceLogBO);
//                                    if (pageResult1 != null) {
//                                        if (pageResult1.getData() != null) {
//                                            if (pageResult1.getData().getRecords() != null && pageResult1.getData().getSize() > 0) {
//                                                for (PayZjBalanceLogVO record : pageResult1.getData().getRecords()) {
//                                                    PayFundDetailsDTO payFundDetailsDTO = new PayFundDetailsDTO();
//                                                    payFundDetailsDTO.setId(ymlConfig.getPkId());
//                                                    try {
//                                                        BeanUtils.copyProperties(payFundDetailsDTO, record);
//                                                    } catch (IllegalAccessException e) {
//                                                        e.printStackTrace();
//                                                    } catch (InvocationTargetException e) {
//                                                        e.printStackTrace();
//                                                    }
//                                                    payFundDetailsService.insert(payFundDetailsDTO);
//                                                }
//                                            }
//                                        }
//                                    }
//                                }
//                            }
//
//                        }
//                    }
//
//            }
//        }
//    }
//
//    //admin前一天的资金明细数据入库
//    @Scheduled(cron = "0 14 7 * * ?")
//    public void fundDetailByHistoryAdmin(){
//        log.info("--------------定时任务：资金明细入库 ------------------");
//        EntityWrapper<PayUserDTO> wrapper = new EntityWrapper<>();
//        wrapper.eq("account_type",3);
//        wrapper.eq("user_id",ztgfIncomeUserId);
//        List<PayUserDTO> list = payUserService.selectList(wrapper);
//        log.info("====================list="+list.size());
//        if (list!=null && list.size()>0) {
//            for (PayUserDTO payUserDTO : list) {
//                PayZjBalanceLogBO payZjBalanceLogBO = new PayZjBalanceLogBO();
//                payZjBalanceLogBO.setUserId(payUserDTO.getUserId());
//                payZjBalanceLogBO.setPageNo(1);
//                payZjBalanceLogBO.setPageSize(20);
//
//                LocalDate endDate = LocalDate.now();
//                LocalDate biginDate = endDate.plusDays(-1);
//                endDate=biginDate;
//                ZoneId zone = ZoneId.systemDefault();
//                Instant instant = biginDate.atStartOfDay().atZone(zone).toInstant();
//                Instant instant1 = endDate.atStartOfDay().atZone(zone).toInstant();
//                java.util.Date bdate = Date.from(instant);
//                java.util.Date edate = Date.from(instant1);
//
//                payZjBalanceLogBO.setStartDate(bdate);
//                payZjBalanceLogBO.setEndDate(edate);
//
//                Result<Page<PayZjBalanceLogVO>> pageResult = payUserService.queryPageZjHistoryBalanceLogAdmin(payZjBalanceLogBO);
//                if (pageResult != null) {
//                    Page<PayZjBalanceLogVO> data = pageResult.getData();
//                    if (data != null) {
//                        if (data.getTotal() > 0) {
//
//                            int ceil= data.getTotal()%data.getSize()>0? (data.getTotal()/data.getSize()+1):data.getTotal()/data.getSize();
//                            for (int j = 1; j <= ceil; j++) {
//                                payZjBalanceLogBO.setPageNo(j);
//                                Result<Page<PayZjBalanceLogVO>> pageResult1 = payUserService.queryPageZjHistoryBalanceLogAdmin(payZjBalanceLogBO);
//                                if (pageResult1 != null) {
//                                    if (pageResult1.getData() != null) {
//                                        if (pageResult1.getData().getRecords() != null && pageResult1.getData().getSize() > 0) {
//                                            for (PayZjBalanceLogVO record : pageResult1.getData().getRecords()) {
//                                                PayFundDetailsDTO payFundDetailsDTO = new PayFundDetailsDTO();
//                                                payFundDetailsDTO.setId(ymlConfig.getPkId());
//                                                try {
//                                                    BeanUtils.copyProperties(payFundDetailsDTO, record);
//                                                } catch (IllegalAccessException e) {
//                                                    e.printStackTrace();
//                                                } catch (InvocationTargetException e) {
//                                                    e.printStackTrace();
//                                                }
//                                                payFundDetailsService.insert(payFundDetailsDTO);
//                                            }
//                                        }
//                                    }
//                                }
//                            }
//                        }
//
//                    }
//                }
//
//            }
//        }
//    }


    //前一天的资金明细数据入库
    @Scheduled(cron = "0 15 5 * * ?")
//    @Scheduled(cron = "0 20/1 * * * ?")
    public void executeFundDetail() {
        log.info("--------------定时任务：资金明细入库 ------------------");

        PayFundSyncDTO syncDTO = payFundSyncService.getLastDTO();
        Date beginDate = DateUtils.getDateByStr("2020-01-01 00:00:00");
//        Date endDate = DateUtils.addDay(DateUtils.getCurrentDate(), -1);
        Date endDate = DateUtils.getDayStart(DateUtils.getCurrentDate());
        if (syncDTO != null) {
            beginDate = DateUtils.addDay(syncDTO.getSyncTime(), 1);
        }
        payFundSyncService.saveSync(beginDate, endDate);
    }


//    /**
//     * 暂时 每1分钟执行一次 更新订单过期时间
//     */
//    @Scheduled(cron = "0 20/1 * * * ?")
//    public void executeBalanceRepay(){
//        //获取企业申请中企业信息
//        log.info("--------------定时任务：保存查询余额退款状态 ------------------");
//        Wrapper wrapper = new EntityWrapper();
//        wrapper.eq("type", 0);
//        Object[] status = {0, 1};
//        wrapper.in("status", status);
//        List<PayOrderRepayDTO> list = payOrderRepayService.selectList(wrapper);
//        if(list != null && list.size() > 0){
//            for (PayOrderRepayDTO dto : list) {
//                payOrderRepayService.saveBalanceRepayLog(dto);
//            }
//        }
//    }

//
//    /**
//     * 暂时 每1分钟执行一次 更新订单过期时间
//     */
//    @Scheduled(cron = "0 30/1 * * * ?")
//    public void executeOnlineBlankRepay(){
//        log.info("--------------定时任务：保存查询网银退款状态 ------------------");
//        Wrapper wrapper = new EntityWrapper();
//        wrapper.eq("type", 1);
//        Object[] status = {0, 1};
//        wrapper.in("status", status);
//        List<PayOrderRepayDTO> list = payOrderRepayService.selectList(wrapper);
//        if(list != null && list.size() > 0){
//            for (PayOrderRepayDTO dto : list) {
//                payOrderRepayService.saveOnlineBankRepayLog(dto);
//            }
//        }
//    }


}
